#ifndef VARIABLE_H
#define VARIABLE_H
/*значение определенного (или неопределенного) типа*/
struct CValue
{
  enum Type
  {
    UNDEF, //тип не задан
    INT,
    FLOAT,
    BOOL,
    VEC
  }
  
  /*тип переменной*/
  Type t;
  
  /*индекс в таблице констант*/
  int attr;
  
  CValue(Type t=UNDEF, int a=0): type(t), attr(a)
  {}
  
};

/*что-то с именем и значением. переменная.*/
struct CVariable
{
public:
  /*индекс имени переменной в таблице идентификаторов*/
  int id_attr;
  
  /*значение переменной*/
  CValue val;
  
  bool operator ==(const CVariable& v)
  {
    return name==v.name;
  }
  
  bool operator <(const CVariable& v)
  {
    return name<v.name;
  }
  
  CVariable(int id, CValue::Type type=CValue::UNDEF, int attr=0): id_attr(id), val(type, attr)
  {}
};

class CVariablesTable
{
  /*переменные, доступ по индексу*/
  std::map<int, CVariable> m_variables;
  
  /*для переменных с именем: отображение идентификатора на индекс в таблице переменных*/
  std::map<std::string, int> m_Ids;
  
  public:
  /*получить идентификатор */
  int getVarId(const char* name)
  {
    if(m_Ids.find(name))
      return m_Ids[name];
    return -1;
  }
  
  int createVariable(std::string name, CValue::Type type=CVariable;:UNDEF, int val=0)
  {
    if( getVarId(name.c_str())!=-1 )
      return getVarId(name.c_str());
    CVariable v(name, type, val);
    
    int id = m_variables.size(); //todo кажется, они никогда не будут удаляться
    m_variables[id] = v;
    m_Ids[name] = id;
    return id;
  }
  
  int 
  
  setType(int id, CValue::Type type)
  {
    
  }
};

#endif
